home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / PROFILER / MENDEL.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-06-16  |  9.1 KB  |  259 lines

  1. PROGRAM Mendels_Land; { 7. Bundeswettbewerb Informatik 1988/1989 }
  2.                       { 1. Runde, Aufgabe 5 ; Autor M. Berger    }
  3.  
  4.  CONST   Max_Anzahl_Merkmale = 4;
  5.  
  6.  TYPE    Elternteil_DEF      = (Mutter,Vater,Kind);
  7.          Typname_DEF       = (Muster,Farbe,Fuehlerform);
  8.          Merkmalspeicher     = STRING[20];
  9.          Dominanz_Liste_TEIL = RECORD
  10.                                  Merkmal   : Merkmalspeicher;
  11.                                  Anz_rezes : INTEGER;
  12.                                  rezessive : ARRAY [1..Max_Anzahl_Merkmale]
  13.                                                    OF Merkmalspeicher;
  14.                                END;
  15.                                  
  16.          Dominanz_Liste_TYP  =  
  17.                            ARRAY [Typname_DEF,1..Max_Anzahl_Merkmale]
  18.                                  OF Dominanz_Liste_TEIL; 
  19.            
  20.  VAR     Dominanz_Liste   : Dominanz_Liste_TYP;
  21.          Merkmale         : ARRAY [Elternteil_DEF,Typname_DEF,1..2]
  22.                                     OF Merkmalspeicher;
  23.          Anz_Kinder       : INTEGER;
  24.          Elternteil       : Elternteil_DEF;
  25.          Typ              : Typname_DEF;
  26.          Zaehler          : INTEGER;
  27.  
  28.  
  29.  PROCEDURE Initialisierung;
  30.    VAR i : INTEGER;
  31.    BEGIN
  32.      FOR Typ:=Muster TO Fuehlerform DO
  33.        FOR i:=1 TO Max_Anzahl_Merkmale DO
  34.          Dominanz_Liste[Typ,i].Merkmal:='';
  35.      
  36.      Dominanz_Liste[Muster,1].Merkmal:='uni';
  37.        Dominanz_Liste[Muster,1].Anz_rezes:=3;
  38.        Dominanz_Liste[Muster,1].rezessive[1]:='uni';
  39.        Dominanz_Liste[Muster,1].rezessive[2]:='schwarz gepunktet';
  40.        Dominanz_Liste[Muster,1].rezessive[3]:='schwarz gestreift';
  41.      Dominanz_Liste[Muster,2].Merkmal:='schwarz gepunktet';
  42.        Dominanz_Liste[Muster,2].Anz_rezes:=2;
  43.        Dominanz_Liste[Muster,2].rezessive[1]:='schwarz gepunktet';
  44.        Dominanz_Liste[Muster,2].rezessive[2]:='schwarz gestreift';
  45.      Dominanz_Liste[Muster,3].Merkmal:='schwarz gestreift';
  46.        Dominanz_Liste[Muster,3].Anz_rezes:=1;
  47.        Dominanz_Liste[Muster,3].rezessive[1]:='schwarz gestreift';
  48.      
  49.      Dominanz_Liste[Farbe,1].Merkmal:='rot';
  50.        Dominanz_Liste[Farbe,1].Anz_rezes:=3;
  51.        Dominanz_Liste[Farbe,1].rezessive[1]:='rot';
  52.        Dominanz_Liste[Farbe,1].rezessive[2]:='grün';
  53.        Dominanz_Liste[Farbe,1].rezessive[3]:='blau';
  54.      Dominanz_Liste[Farbe,2].Merkmal:='gelb';
  55.        Dominanz_Liste[Farbe,2].Anz_rezes:=3;
  56.        Dominanz_Liste[Farbe,2].rezessive[1]:='gelb';
  57.        Dominanz_Liste[Farbe,2].rezessive[2]:='rot';
  58.        Dominanz_Liste[Farbe,2].rezessive[3]:='blau';
  59.      Dominanz_Liste[Farbe,3].Merkmal:='grün';
  60.        Dominanz_Liste[Farbe,3].Anz_rezes:=3;
  61.        Dominanz_Liste[Farbe,3].rezessive[1]:='grün';
  62.        Dominanz_Liste[Farbe,3].rezessive[2]:='gelb';
  63.        Dominanz_Liste[Farbe,3].rezessive[3]:='blau';
  64.      Dominanz_Liste[Farbe,4].Merkmal:='blau';
  65.        Dominanz_Liste[Farbe,4].Anz_rezes:=1;
  66.        Dominanz_Liste[Farbe,4].rezessive[1]:='blau';
  67.      
  68.      Dominanz_Liste[Fuehlerform,1].Merkmal:='gerade';
  69.        Dominanz_Liste[Fuehlerform,1].Anz_rezes:=2;
  70.        Dominanz_Liste[Fuehlerform,1].rezessive[1]:='gerade';
  71.        Dominanz_Liste[Fuehlerform,1].rezessive[2]:='gekrümmt';
  72.      Dominanz_Liste[Fuehlerform,2].Merkmal:='gekrümmt';
  73.        Dominanz_Liste[Fuehlerform,2].Anz_rezes:=1;
  74.        Dominanz_Liste[Fuehlerform,2].rezessive[1]:='gekrümmt';
  75.    END;
  76.  
  77.  PROCEDURE Eingabe;
  78.    BEGIN
  79.      CLRSCR;WRITELN('Mendels Land  (bwINF 7 [88/89];Aufgabe 5)');WRITELN;
  80.      FOR Elternteil:=Mutter TO Vater DO
  81.      BEGIN
  82.        WRITE(' Bitte Merkmale ');
  83.        IF Elternteil=Mutter 
  84.        THEN 
  85.          WRITE('der Mutter ')
  86.        ELSE 
  87.          WRITE('des Vaters ');
  88.        WRITELN('angeben');
  89.        FOR Typ:=Muster TO Fuehlerform DO
  90.        BEGIN
  91.          WRITE('  Bitte ');
  92.          CASE Typ OF
  93.            Muster      : WRITE('Muster ');
  94.            Farbe       : WRITE('Flügelfarbe ');
  95.            Fuehlerform : WRITE('Fühlerform ');
  96.          END;
  97.          WRITE('eingeben : ');
  98.          READLN(Merkmale[Elternteil,Typ,1]);
  99.        END;
  100.      END;
  101.      WRITE('Anzahl der Kinder eingeben : ');READLN(Anz_Kinder);
  102.    END;
  103.    
  104.  PROCEDURE Ermittle_rezessive_Merkmale;
  105.    VAR  i  : INTEGER;
  106.    BEGIN
  107.      FOR Elternteil:=Mutter TO Vater DO
  108.      BEGIN
  109.        FOR Typ:=Muster TO Fuehlerform DO
  110.        BEGIN
  111.          Merkmale[Elternteil,Typ,2]:='';
  112.          i:=0;
  113.          REPEAT
  114.            i:=i+1;
  115.            IF Dominanz_Liste[Typ,i].Merkmal=Merkmale[Elternteil,Typ,1]
  116.            THEN
  117.              Merkmale[Elternteil,Typ,2]:=Dominanz_Liste[Typ,i].rezessive
  118.                                   [RANDOM(Dominanz_Liste[Typ,i].Anz_rezes)+1];
  119.          UNTIL Merkmale[Elternteil,Typ,2]<>'';
  120.        END;
  121.      END;
  122.    END;
  123.  
  124.  PROCEDURE Erbmerkmal_ermitteln;
  125.    VAR i : INTEGER;
  126.    BEGIN
  127.      FOR Elternteil:=Mutter TO Vater DO
  128.      BEGIN
  129.        FOR Typ:=Muster TO Fuehlerform DO
  130.        BEGIN
  131.           i:=ROUND(INT(RANDOM*2))+1;
  132.           IF Elternteil=Mutter THEN
  133.             Merkmale[Kind,Typ,1]:=Merkmale[Elternteil,Typ,i];
  134.           IF Elternteil=Vater THEN
  135.             Merkmale[Kind,Typ,2]:=Merkmale[Elternteil,Typ,i];
  136.        END;
  137.      END;
  138.    END;
  139.  
  140.  PROCEDURE dom_Erbmerkmal_ermitteln;
  141.    VAR i,u             : INTEGER;
  142.        swap_hlp        : Merkmalspeicher;
  143.        beenden         : BOOLEAN;
  144.    BEGIN
  145.      FOR Typ:=Muster TO Fuehlerform DO
  146.      BEGIN
  147.        i:=0;
  148.        beenden:=FALSE;
  149.        REPEAT
  150.          i:=i+1;
  151.          IF Merkmale[Kind,Typ,2]=
  152.             Dominanz_Liste[Typ,i].Merkmal 
  153.          THEN
  154.          BEGIN
  155.            FOR u:=1 TO Dominanz_Liste[Typ,i].Anz_rezes DO
  156.            BEGIN
  157.              IF Dominanz_Liste[Typ,i].rezessive[u]
  158.                 =Merkmale[Kind,Typ,1]
  159.              THEN 
  160.              BEGIN
  161.                swap_hlp:=Merkmale[Kind,Typ,2];
  162.                Merkmale[Kind,Typ,2]:=Merkmale[Kind,Typ,1];
  163.                Merkmale[Kind,Typ,1]:=swap_hlp;
  164.                beenden:=TRUE;
  165.              END;
  166.            END;
  167.          END;
  168.        UNTIL (beenden) OR (i=Max_Anzahl_Merkmale);
  169.      END;
  170.    END;
  171.  
  172.  PROCEDURE Ausgabe;
  173.    VAR x           : CHAR;
  174.    BEGIN
  175.      CLRSCR;
  176.      WRITELN('Mendels Land  (bwINF 7 [88/89];Aufgabe 5)');WRITELN;
  177.      FOR elternteil:=Mutter TO Kind DO
  178.      BEGIN
  179.        WRITE(' Merkmale');
  180.        IF elternteil=Mutter 
  181.        THEN 
  182.          WRITELN(' der Mutter :')
  183.        ELSE 
  184.          IF elternteil=Vater 
  185.          THEN 
  186.            WRITELN(' des Vaters :')
  187.          ELSE 
  188.            WRITELN(' des ',Zaehler,'. Kindes :');
  189.        FOR Typ:=Muster to Fuehlerform DO
  190.        BEGIN
  191.          WRITE('   - ');
  192.          CASE Typ OF
  193.            Muster      : WRITE('Muster :');
  194.            Farbe       : WRITE('Farbe  :');
  195.            Fuehlerform : WRITE('Fühler :');
  196.          END;
  197.          WRITELN(' Dominant ',Merkmale[elternteil,Typ,1],
  198.                  ' ; Rezessiv ',Merkmale[elternteil,Typ,2]);
  199.        END;
  200.      END;
  201.      READ(kbd,x);
  202.    END;
  203.    
  204.    BEGIN
  205.      Initialisierung;
  206.      Eingabe;
  207.      Ermittle_rezessive_Merkmale;
  208.      FOR Zaehler:=1 TO Anz_Kinder DO
  209.      BEGIN
  210.        Erbmerkmal_ermitteln;
  211.        dom_Erbmerkmal_ermitteln;
  212.        Ausgabe;
  213.      END;
  214.    END.
  215.  
  216. { Problemstellung :
  217.  
  218.   In Mendels Land gibt es eine fantastische Vielfalt von Schmetterlingen.
  219.   Man sieht welche mit roten schwarz gepunkteten Flügeln und gekrümmten
  220.   Fühlern, andere sind schwargelb gesteift und haben gerade Fühler usw.
  221.   Bei längerer Beobachtung können wir drei Typen von Merkmalen unterscheiden :
  222.   1. Musterung : uni,schwarz gepunktet,schwarz gestreift
  223.   2. Flügelfarbe : rot,gelb,grün oder blau
  224.   3. Fühlerform : gerade oder gekrümmt
  225.   Es stellt sich heraus, daß jeder Schmetterling pro Merkmalstyp ein dominan-
  226.   tes Merkmal (das sieht man) und ein rezessives Merkmal (das sieht man nicht
  227.   oder ist gleich dem ersten) in sich trägt.
  228.   Es gelten folgende Dominanzregeln :
  229.   uni dominiert schwarz gepunktet oder schwarz gestreift
  230.   schwarz gepunktet dominiert schwarz gestreift
  231.   rot dominiert grün und blau
  232.   gelb dominiert rot und blau
  233.   grün dominiert gelb und blau
  234.   gerade dominiert gekrümmt.
  235.   Ein Schmetterling erbt für jeden Merkmalstyp von beiden Eltern zufällig
  236.   je eines von deren zwei Merkmalen. Die in dieser neuen Kombination dominanten
  237.   Merkmale bestimmen dann das Aussehen des späteren neuen Schmetterlings.
  238.   Zum Bleistift :
  239.   Mutter : sichtbar    uni-rot-gerade
  240.            unsichtbar  schwarz gesteift-blau-gekrümmt
  241.   Vater  : sichtbar    uni-grün-gerade
  242.            unsichtbar  schwarz gepunktet-grün-gekrümmt
  243.   Kind   : zufällig von Mutter : schwarz-gestreift-blau-gekrümmt
  244.            zufällig vom Vater  : uni-grün-gekrümmt
  245.            sichtbar    uni-grün-gekrümmt.
  246.   Schreibe ein Programm, das bei Eingabe der dominanten Merkmale zweier Eltern
  247.   und der gewünschten Kinderzahl entsprechend viele Kinder "mendelt" und
  248.   beschreibt. Die rezessiven Merkmale der Eltern werden vom Programm zufällig,
  249.   aber unter Beachtung der Dominanzregeln hinzugefügt.
  250.   
  251.   Beispiel :
  252.   
  253.    Wie oben erläutert, 5 Kinder.
  254.    
  255.   Besonderheiten :
  256.   
  257.    Variablenzählung.
  258. }